<?php
require(dirname(__FILE__) . '/includes/init.php');

class UploadFile {
	var $user_post_file = array(); //用户上传的文件
	var $save_file_path;    //存放用户上传文件的路径
	var $max_file_size;     //文件最大尺寸
	var $last_error;     //记录最后一次出错信息
	//默认允许用户上传的文件类型
	var $allow_type = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf', 'txt','docx','xls');
	var $final_file_path; //最终保存的文件名

	var $save_info = array(); //返回一组有用信息，用于提示用户。

	/**
	* 构造函数，用与初始化相关信息，用户待上传文件、存储路径等
	*
	* @param Array $file 用户上传的文件
	* @param String $path 存储用户上传文件的路径
	* @param Integer $size 允许用户上传文件的大小(字节)
	* @param Array $type   此数组中存放允计用户上传的文件类型
	*/
	function UploadFile($file, $path, $size = 20971520, $type = '') {
		$this->user_post_file = $file;
		$this->save_file_path = $path;
		$this->max_file_size = $size; //如果用户不填写文件大小，则默认为2M.
		if ($type != '') $this->allow_type = $type;
	}

	/**
	* 存储用户上传文件，检验合法性通过后，存储至指定位置。
	* @access public
	* @return int    值为0时上传失败，非0表示上传成功的个数。
	*/
	function upload() {

	for ($i = 0; $i < count($this->user_post_file['name']); $i++) {
		//如果当前文件上传功能，则执行下一步。
		if ($this->user_post_file['error'][$i] == 0) {
			//取当前文件名、临时文件名、大小、扩展名，后面将用到。
			$name = $this->user_post_file['name'][$i];
			$tmpname = $this->user_post_file['tmp_name'][$i];
			$size = $this->user_post_file['size'][$i];
			$mime_type = $this->user_post_file['type'][$i];
			$type = $this->getFileExt($this->user_post_file['name'][$i]);
			//检测当前上传文件大小是否合法。
			if (!$this->checkSize($size)) {
				$this->last_error = "The file size is too big. File name is: ".$name;
				$msg = $this->halt($this->last_error);
				continue;
			}
			//检测当前上传文件扩展名是否合法。
			if (!$this->checkType($type)) {
				$this->last_error = "Unallowable file type: .".$type." File name is: ".$name;
				$msg = $this->halt($this->last_error);
				continue;
			}
			//检测当前上传文件是否非法提交。
			if(!is_uploaded_file($tmpname)) {
				$this->last_error = "Invalid post file method. File name is: ".$name;
				$msg = $this->halt($this->last_error);
				continue;
			}
			//移动文件后，重命名文件用。
			$basename = $this->getBaseName($name, ".".$type);
			//移动后的文件名
			$saveas = $basename."-".date('YmdHis',time()).".".$type;
			//组合新文件名再存到指定目录下，格式：存储路径 + 文件名 + 时间 + 扩展名
			$this->final_file_path = $this->save_file_path."/".$saveas;
			if(!move_uploaded_file($tmpname, $this->final_file_path)) {
				$this->last_error = $this->user_post_file['error'][$i];
				$msg = $this->halt($this->last_error);
				continue;
			}
			//存储当前文件的有关信息，以便其它程序调用。
			$this->save_info[] = array("name" => $name, "type" => $type,
								"mime_type" => $mime_type,
                             "size" => $size, "saveas" => $saveas,
                             "path" => $this->final_file_path);
		}
	}
	return count($this->save_info); //返回上传成功的文件数目
}

/**
* 返回一些有用的信息，以便用于其它地方。
* @access public
* @return Array 返回最终保存的路径
*/
function getSaveInfo() {
	return $this->save_info;
}

/**
* 检测用户提交文件大小是否合法
* @param Integer $size 用户上传文件的大小
* @access private
* @return boolean 如果为true说明大小合法，反之不合法
*/
function checkSize($size) {
if ($size > $this->max_file_size) {
   return false;
}
else {
   return true;
}
}

/**
* 检测用户提交文件类型是否合法
* @access private
* @return boolean 如果为true说明类型合法，反之不合法
*/
function checkType($extension) {
foreach ($this->allow_type as $type) {
   if (strcasecmp($extension , $type) == 0)
    return true;
}
return false;
}

/**
* 显示出错信息
* @param $msg    要显示的出错信息     
* @access private
*/
function halt($msg) {
	return printf("<b><UploadFile Error:></b> %s <br>\n", $msg);
}

/**
* 取文件扩展名
* @param String $filename 给定要取扩展名的文件
* @access private
* @return String      返回给定文件扩展名
*/
function getFileExt($filename) {
$stuff = pathinfo($filename);
return $stuff['extension'];
}
/**
* 取给定文件文件名，不包括扩展名。
* eg: getBaseName("j:/hexuzhong.jpg"); //返回 hexuzhong
* 
* @param String $filename 给定要取文件名的文件
* @access private
* @return String 返回文件名
*/
function getBaseName($filename, $type) {
	$basename = basename($filename, $type);
	return $basename;
}
}
if ($_REQUEST['action'] == "上传") {
//设置允许用户上传的文件类型。
$type = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt','xls','doc','docx');
//实例化上传类，第一个参数为用户上传的文件组、第二个参数为存储路径、
//第三个参数为文件最大大小。如果不填则默认为2M
//第四个参数为充许用户上传的类型数组。如果不填则默认为gif, jpg, png, zip, rar, txt, doc, pdf
$upload = new UploadFile($_FILES['user_upload_file'], dirname(__FILE__) .'/userUpload',1000000);
//上传用户文件，返回int值，为上传成功的文件个数。
$num = $upload->upload();
$info=$upload->getSaveInfo();
if ($num != 0) {
//echo "上传成功<br>";
//取得文件的有关信息，文件名、类型、大小、路径。用print_r()打印出来。
//print_r($info);
//格式为： Array
//   (
//    [0] => Array(
//        [name] => example.txt
//        [type] => txt
//        [size] => 526
//        [path] => j:/tmp/example-1108898806.txt
//        )
//   )

 $msg = $num."个文件上传成功";
}
else {
	$msg ="上传失败<br>";
}
for($i=0;$i<$num;$i++)
{
    //$OldFile.=$info[$i][name].",";
	$NewFile=$info[$i][saveas];
	$db->query("insert into ".$ecs->table('upload')." (title,name,add_time,c_type) values ('".$_REQUEST['title']."','".$NewFile."','".time()."',1)");
	sleep(2);
}
}
else if($_REQUEST['action'] == "down"){
	$ok = download('./userUpload/'.$_REQUEST['name'],$_REQUEST['name']);
	if(!$ok){
		$msg = "未找到源文件";
	}
}
$sql = "select * from ".$ecs->table('upload')."where c_type=1 order by add_time desc";
$upload_list = $db->getAll($sql); 


function download($url, $filename) {   
        // 获得文件大小, 防止超过2G的文件, 用sprintf来读
		if(file_exists($url)){
        	$filesize = sprintf ( "%u", filesize ( $url ) ); 
		}   
        $filesize = sprintf ( "%u", filesize ( $url ) );   
        if (! $filesize) {   
            return;   
         }   
         header ( "Content-type:application/octet-stream\n" ); //application/octet-stream   
         header ( "Content-type:unknown/unknown;" );   
         header ( "Content-disposition: attachment; filename=\"" . $filename . "\"" );   
         header ( 'Content-transfer-encoding: binary' );   
        if ($range = getenv ( 'HTTP_RANGE' )) { // 当有偏移量的时候，采用206的断点续传头   
            $range = explode ( '=', $range );   
            $range = $range [1];   
               
             header ( "HTTP/1.1 206 Partial Content" );   
             header ( "Date: " . gmdate ( "D, d M Y H:i:s" ) . " GMT" );   
             header ( "Last-Modified: " . gmdate ( "D, d M Y H:i:s", filemtime ( $url ) ) . " GMT" );   
             header ( "Accept-Ranges: bytes" );   
             header ( "Content-Length:" . ($filesize - $range) );   
             header ( "Content-Range: bytes " . $range . ($filesize - 1) . "/" . $filesize );   
             header ( "Connection: close" . "\n\n" );   
         } else {   
             header ( "Content-Length:" . $filesize . "\n\n" );   
            $range = 0;   
         }   
         loadFile ( $url );   
    }   
      
    function loadFile($filename, $retbytes = true) {   
        $buffer = '';   
        $cnt = 0;   
        $handle = fopen ( $filename, 'rb' );   
        if ($handle === false) {   
            return false;   
         }   
        while ( ! feof ( $handle ) ) {   
            $buffer = fread ( $handle, 1024 * 1024 );   
            echo $buffer;   
             ob_flush ();   
            flush ();   
            if ($retbytes) {   
                $cnt += strlen ( $buffer );   
             }   
         }   
        $status = fclose ( $handle );   
        if ($retbytes && $status) {   
            return $cnt; // return num. bytes delivered like readfile() does.   
         }   
        return $status;   
    }   
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>管理中心 - 杂项登记 </title>
<meta name="robots" content="noindex, nofollow">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/general.css" rel="stylesheet" type="text/css" />
<link href="styles/main.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/jquery.min.js"></script>
</head>
<body>
<h1>
<span class="action-span1"><a target="_top" href="index.php?act=main">管理中心</a> </span><span id="search_id" class="action-span1"> - 杂项登记 </span>
<div style="clear:both"></div>
</h1>
<?php if($msg){?>
<div class="form-div" id="error">
  <span><a href="#" onclick="javascript:err_hide()" title="关闭"><img src="images/no.gif" border="0" alt="关闭"></a><?php echo $msg; ?></span>
</div>
<?php }?>
<div class="list-div">
<form id="form1" name="form1" method="post" enctype="multipart/form-data" action="" onsubmit="return check_uoload()">
标题：<input type="text" name="title" size="40" id="title"><input id="user_load" type="file" name="user_upload_file[]" size=50 class="button"> <span id="addfile"></span>
<!--<input name="123" type="button" onclick='var atobj = document.all("addfile");atobj.outerHTML = "<br>标题：<input type=text name=title[] size=40><input type=file size=50 name=user_upload_file[] class=button>" + atobj.outerHTML;' value="增加附件" class="button">-->
<label>
<input type="submit" name="action" value="上传" class="button"/>
</label>
</form> 
</div>

<div class="list-div" id="listDiv">
<table cellpadding="3" cellspacing="1">
  <tr>
    <th>标题</th>
	<th>时间</th>
    <th>下载</th>
  </tr>
  <?php
  if(count($upload_list)>0){
	foreach($upload_list AS $upload){
  ?>
  <tr>
    <td><?php echo $upload['title'];?></td>
	<td><?php echo date('Y-m-d H:i:s',$upload['add_time']);?></td>
	<td><a href="?action=down&name=<?php echo $upload['name'];?>">附件</a></td>
  </tr>
  <?php
  	}
  }	
  ?>
</div>
<script type="text/javascript">
var num = <?php echo count($order_list);?>;
for (i=1;i<=num;i++){
    hide_show(i);
}
function hide_show(i){
	$("#order_"+i).hover(function() {         
        $("#address_"+i).show();  
    },function(){
           $("#address_"+i).fadeOut(1000);  
        }

   ); 
}

function err_hide(){
	 $("#error").css("display","none"); 
}
function check_uoload(){
	var title = $("#title").val();
	var user_load = $("#user_load").val();
	var msg = '';
	if(title.length<=0){
		msg += '请输入标题\n';
	}
	if(user_load.length<=0){
		msg += '请选择要上传附件\n';
	}
	if(msg.length>0){
	    alert(msg);
		return false;
	}else{
		return true;
	}
	
}
</script>
</body>
</html>
 

